package com.shujia.day11;

import java.util.*;

public class Demo01Java2SQL {
    public static void main(String[] args) {

         /*
            TODO 现阶段大家能完成的需求
                数据总量是一定的  可以保存到集合中
                对批量数据进行做判断
                    排序 最大值 最小值 关联 分组求和 数据过滤 排名
                    SQL =>
                        (FROM 数据加载？ 可以从控制台输入数据)
                        JOIN  ON 关联 => 两个集合之间的遍历
                        WHERE 过滤 => 集合删除
                        GROUP BY 分组 => 使用Map+List结构
                        HAVING 统计过滤 => 删除
                        ORDER BY 排序 => sort函数 TreeMap ..
                        Limit 限制数据 => for循环遍历
                   思考上述过程如何实现
         */

        /*

                1500100001,施笑槐,22,女,文科六班
                1500100002,吕金鹏,24,男,文科六班
                1500100003,单乐蕊,22,女,理科六班
                1500100004,葛德曜,24,男,理科三班
                1500100005,宣谷芹,22,女,理科五班
                1500100006,边昂雄,21,男,理科二班
                1500100007,尚孤风,23,女,文科六班
                1500100008,符半双,22,女,理科六班
                1500100009,沈德昌,21,男,理科一班
         */

        Student student1 = new Student("1500100001", "施笑槐", 22, "女", "文科六班", 540);
        Student student2 = new Student("1500100002", "吕金鹏", 24, "男", "文科六班", 660);
        Student student3 = new Student("1500100003", "单乐蕊", 22, "女", "理科六班", 490);
        Student student4 = new Student("1500100004", "葛德曜", 24, "男", "理科六班", 320);
        Student student5 = new Student("1500100005", "宣谷芹", 21, "女", "理科六班", 321);
        Student student6 = new Student("1500100006", "边昂雄", 22, "男", "理科六班", 540);
        Student student7 = new Student("1500100007", "尚孤风", 23, "女", "文科六班", 440);
        Student student8 = new Student("1500100008", "符半双", 22, "女", "文科六班", 340);
        Student student9 = new Student("1500100009", "沈德昌", 21, "男", "文科六班", 200);


        /*
          TODO  对学生数据按照总分进行排序
            方式1：
                使用List将所有的数据存入集合，之后再使用sort方法排序
            方式2：
                使用treeSet存储数据
         */

        ArrayList<Student> arrayList = new ArrayList<>();
        arrayList.add(student1);
        arrayList.add(student2);
        arrayList.add(student3);
        arrayList.add(student4);
        arrayList.add(student5);
        arrayList.add(student6);
        arrayList.add(student7);
        arrayList.add(student8);
        arrayList.add(student9);

        arrayList.sort(new Comparator<Student>() {
            @Override
            public int compare(Student thisStu, Student otherStu) {
                // TODO 使用 IF 判断方式
//                if (thisStu.totalScore - otherStu.totalScore > 0) {
//                    return -1;
//                } else if (thisStu.totalScore - otherStu.totalScore < 0) {
//                    return 1;
//                } else {
//                    return 0;
//                }
                // TODO 使用三目运算符
                return thisStu.totalScore - otherStu.totalScore > 0 ? -1 : thisStu.totalScore - otherStu.totalScore == 0 ? 0 : 1;
                // TODO ? 多条件判断 如果当总分相同时，需要按照ID进行排序
            }
        });

        System.out.println(arrayList);


        // treeSet存储
        TreeSet<Student> treeSet = new TreeSet<>(new Comparator<Student>() {
            /*
                TODO:
                    由于 treeSet 在保存数据时，会对数据进行去重操作，去重的依据就是比较的结果为0
                        在如下给定的条件中，只按照其总分比较，那么会出现总分相同的数据丢失
             */
            @Override
            public int compare(Student thisStu, Student otherStu) {
                return thisStu.totalScore - otherStu.totalScore > 0 ?
                        -1 : thisStu.totalScore - otherStu.totalScore == 0 ?
                        thisStu.id.compareTo(otherStu.id) : 1;  // 当分数相同时，可以直接比较ID
            }
        });
        treeSet.add(student1);
        treeSet.add(student2);
        treeSet.add(student3);
        treeSet.add(student4);
        treeSet.add(student5);
        treeSet.add(student6);
        treeSet.add(student7);
        treeSet.add(student8);
        treeSet.add(student9);

        System.out.println(treeSet);
        System.out.println(treeSet.size()); // 8 => 9

        /*
            排名：
                1.排名不重复，且连续
                2.排名重复，且连续
                3.排名重复，且不连续
         */
        /*
           TODO 1.排名不重复，且连续
         */
        HashMap<Integer, Student> pmHashmap = new HashMap<>();
        for (int i = 0; i < arrayList.size(); i++) {
            pmHashmap.put(i + 1, arrayList.get(i));
        }

        for (Map.Entry<Integer, Student> kv : pmHashmap.entrySet()) {
            System.out.println("排名:" + kv.getKey() + "\t数据：" + kv.getValue());
        }

        // TODO 2.排名重复，且连续

        int denseRank = 0;
        double denseSameTotalScore = -1;
        for (Student student : arrayList) {
            /*
                分析：
                    1.遍历每个排好序的学生数据
                    2.拿当前学生和上一个学生的总分进行比较，如果分数相同，那么排名不变
                    3.如果分数不同，那么对排名进行加1
             */
            if (student.totalScore == denseSameTotalScore) {
                student.setRank(denseRank);
            } else {
                denseRank += 1;
                student.setRank(denseRank);
                denseSameTotalScore = student.totalScore;
            }
        }
        System.out.println("========DENSE_RANK==========");
        for (Student student : arrayList) {
            System.out.println("排名:" + student.getRank() + "\t 信息:" + student);
        }

        /*
            TODO 3.排名重复，且不连续
         */
        int rank = 0;
        int sameCnt = 0;
        double sameTotalScore = -1;
        for (Student student : arrayList) {
            /*
                分析：
                    1.遍历每个排好序的学生数据
                    2.拿当前学生和上一个学生的总分进行比较，如果分数相同，那么排名不变
                         同时需要再添加一个有多少个相同的成绩数据
                    3.如果分数不同，那么对排名进行加1
             */
            if (student.totalScore == sameTotalScore) {
                student.setRank(rank);
                sameCnt += 1; // 相同学生成绩的个数进行加1操作
            } else {
                rank += (1+sameCnt);
                sameCnt = 0;
                student.setRank(rank);
                sameTotalScore = student.totalScore;
            }
        }
        System.out.println("========RANK==========");
        for (Student student : arrayList) {
            System.out.println("排名:" + student.getRank() + "\t 信息:" + student);
        }

    }
}

class Student {
    String id;  // id 唯一表示一条数据
    String name;
    int age;
    String gender;
    String clazz;
    double totalScore;
    private int rank; // 排名

    public int getRank() {
        return rank;
    }

    public void setRank(int rank) {
        this.rank = rank;
    }

    public Student(String id, String name, int age, String gender, String clazz) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.gender = gender;
        this.clazz = clazz;
    }

    public Student(String id, String name, int age, String gender, String clazz, double totalScore) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.gender = gender;
        this.clazz = clazz;
        this.totalScore = totalScore;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                ", clazz='" + clazz + '\'' +
                ", totalScore=" + totalScore +
                '}';
    }
}
